0% found this document useful (0 votes)
4 views

Components types structure

The document outlines the components and types of operating systems, detailing eight key components such as Process Management, I/O Device Management, and Security Management. It also discusses various operating system types, including Batch, Time-sharing, Distributed, Network, and Real-Time operating systems, along with their advantages and disadvantages. Additionally, it describes different structures of operating systems, such as Simple, Monolithic, and Layered approaches.

Uploaded by

Surya Basnet
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
4 views

Components types structure

The document outlines the components and types of operating systems, detailing eight key components such as Process Management, I/O Device Management, and Security Management. It also discusses various operating system types, including Batch, Time-sharing, Distributed, Network, and Real-Time operating systems, along with their advantages and disadvantages. Additionally, it describes different structures of operating systems, such as Simple, Monolithic, and Layered approaches.

Uploaded by

Surya Basnet
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 26

Components of Operating System

There are various components of an Operating System to perform well defined tasks.
Though most of the Operating Systems differ in structure but logically they have similar
components. Each component must be a well-defined portion of a system that
appropriately describes the functions, inputs, and outputs.
There are following 8-components of an Operating System:

1. Process Management
2. I/O Device Management
3. File Management
4. Network Management
5. Main Memory Management
6. Secondary Storage Management
7. Security Management
8. Command Interpreter System

Following section explains all the above components in more detail:

Process Management
A process is program or a fraction of a program that is loaded in main memory. A process
needs certain resources including CPU time, Memory, Files, and I/O devices to
accomplish its task. The process management component manages the multiple
processes running simultaneously on the Operating System.
A program in running state is called a process.

The operating system is responsible for the following activities in connection with
process management:

• Create, load, execute, suspend, resume, and terminate processes.


• Switch system among multiple processes in main memory.
• Provides communication mechanisms so that processes can communicate with each
others
• Provides synchronization mechanisms to control concurrent access to shared data
to keep shared data consistent.
• Allocate/de-allocate resources properly to prevent or avoid deadlock situation.
I/O Device Management
One of the purposes of an operating system is to hide the peculiarities of specific
hardware devices from the user. I/O Device Management provides an abstract level of
H/W devices and keep the details from applications to ensure proper use of devices, to
prevent errors, and to provide users with convenient and efficient programming
environment.
Following are the tasks of I/O Device Management component:

• Hide the details of H/W devices


• Manage main memory for the devices using cache, buffer, and spooling
• Maintain and provide custom drivers for each device.

File Management
File management is one of the most visible services of an operating system. Computers
can store information in several different physical forms; magnetic tape, disk, and drum
are the most common forms.
A file is defined as a set of correlated information and it is defined by the creator of the
file. Mostly files represent data, source and object forms, and programs. Data files can
be of any type like alphabetic, numeric, and alphanumeric.
A files is a sequence of bits, bytes, lines or records whose meaning is defined by its creator
and user.

The operating system implements the abstract concept of the file by managing mass
storage device, such as types and disks. Also files are normally organized into directories
to ease their use. These directories may contain files and other directories and so on.
The operating system is responsible for the following activities in connection with file
management:

• File creation and deletion


• Directory creation and deletion
• The support of primitives for manipulating files and directories
• Mapping files onto secondary storage
• File backup on stable (nonvolatile) storage media

Network Management
The definition of network management is often broad, as network management involves
several different components. Network management is the process of managing and
administering a computer network. A computer network is a collection of various types
of computers connected with each other.
Network management comprises fault analysis, maintaining the quality of service,
provisioning of networks, and performance management.
Network management is the process of keeping your network healthy for an efficient
communication between different computers.

Following are the features of network management:

• Network administration
• Network maintenance
• Network operation
• Network provisioning
• Network security

Main Memory Management


Memory is a large array of words or bytes, each with its own address. It is a repository
of quickly accessible data shared by the CPU and I/O devices.
Main memory is a volatile storage device which means it loses its contents in the case
of system failure or as soon as system power goes down.
The main motivation behind Memory Management is to maximize memory utilization on
the computer system.

The operating system is responsible for the following activities in connections with
memory management:

• Keep track of which parts of memory are currently being used and by whom.
• Decide which processes to load when memory space becomes available.
• Allocate and deallocate memory space as needed.

Secondary Storage Management


The main purpose of a computer system is to execute programs. These programs,
together with the data they access, must be in main memory during execution. Since the
main memory is too small to permanently accommodate all data and program, the
computer system must provide secondary storage to backup main memory.
Most modern computer systems use disks as the principle on-line storage medium, for
both programs and data. Most programs, like compilers, assemblers, sort routines,
editors, formatters, and so on, are stored on the disk until loaded into memory, and then
use the disk as both the source and destination of their processing.
The operating system is responsible for the following activities in connection with disk
management:

• Free space management


• Storage allocation

Disk scheduling

Security Management
The operating system is primarily responsible for all task and activities happen in the
computer system. The various processes in an operating system must be protected from
each other’s activities. For that purpose, various mechanisms which can be used to
ensure that the files, memory segment, cpu and other resources can be operated on only
by those processes that have gained proper authorization from the operating system.
Security Management refers to a mechanism for controlling the access of programs,
processes, or users to the resources defined by a computer controls to be imposed,
together with some means of enforcement.

For example, memory addressing hardware ensure that a process can only execute
within its own address space. The timer ensure that no process can gain control of the
CPU without relinquishing it. Finally, no process is allowed to do it’s own I/O, to protect
the integrity of the various peripheral devices.

Command Interpreter System


One of the most important component of an operating system is its command
interpreter. The command interpreter is the primary interface between the user and the
rest of the system.
Command Interpreter System executes a user command by calling one or more number
of underlying system programs or system calls.
Command Interpreter System allows human users to interact with the Operating System
and provides convenient programming environment to the users.

Many commands are given to the operating system by control statements. A program
which reads and interprets control statements is automatically executed. This program
is called the shell and few examples are Windows DOS command window, Bash of
Unix/Linux or C-Shell of Unix/Linux.

Other Important Activities


An Operating System is a complex Software System. Apart from the above mentioned
components and responsibilities, there are many other activities performed by the
Operating System. Few of them are listed below:
• Security − By means of password and similar other techniques, it prevents
unauthorized access to programs and data.
• Control over system performance − Recording delays between request for a
service and response from the system.
• Job accounting − Keeping track of time and resources used by various jobs and
users.
• Error detecting aids − Production of dumps, traces, error messages, and other
debugging and error detecting aids.
• Coordination between other softwares and users − Coordination and
assignment of compilers, interpreters, assemblers and other software to the
various users of the computer systems.

Types of Operating System

Operating systems are there from the very first computer generation and they keep
evolving with time. In this chapter, we will discuss some of the important types of
operating systems which are most commonly used.

Batch operating system


The users of a batch operating system do not interact with the computer directly. Each
user prepares his job on an off-line device like punch cards and submits it to the
computer operator. To speed up processing, jobs with similar needs are batched
together and run as a group. The programmers leave their programs with the operator
and the operator then sorts the programs with similar requirements into batches.
The problems with Batch Systems are as follows −
• Lack of interaction between the user and the job.
• CPU is often idle, because the speed of the mechanical I/O devices is slower than
the CPU.
• Difficult to provide the desired priority.

Time-sharing operating systems


Time-sharing is a technique which enables many people, located at various terminals,
to use a particular computer system at the same time. Time-sharing or multitasking is a
logical extension of multiprogramming. Processor's time which is shared among
multiple users simultaneously is termed as time-sharing.
The main difference between Multiprogrammed Batch Systems and Time-Sharing
Systems is that in case of Multiprogrammed batch systems, the objective is to maximize
processor use, whereas in Time-Sharing Systems, the objective is to minimize response
time.
Multiple jobs are executed by the CPU by switching between them, but the switches
occur so frequently. Thus, the user can receive an immediate response. For example, in
a transaction processing, the processor executes each user program in a short burst or
quantum of computation. That is, if n users are present, then each user can get a time
quantum. When the user submits the command, the response time is in few seconds at
most.
The operating system uses CPU scheduling and multiprogramming to provide each user
with a small portion of a time. Computer systems that were designed primarily as batch
systems have been modified to time-sharing systems.
Advantages of Timesharing operating systems are as follows −

• Provides the advantage of quick response.


• Avoids duplication of software.
• Reduces CPU idle time.
Disadvantages of Time-sharing operating systems are as follows −

• Problem of reliability.
• Question of security and integrity of user programs and data.
• Problem of data communication.

Distributed operating System


Distributed systems use multiple central processors to serve multiple real-time
applications and multiple users. Data processing jobs are distributed among the
processors accordingly.
The processors communicate with one another through various communication lines
(such as high-speed buses or telephone lines). These are referred as loosely coupled
systems or distributed systems. Processors in a distributed system may vary in size and
function. These processors are referred as sites, nodes, computers, and so on.
The advantages of distributed systems are as follows −

• With resource sharing facility, a user at one site may be able to use the resources
available at another.
• Speedup the exchange of data with one another via electronic mail.
• If one site fails in a distributed system, the remaining sites can potentially
continue operating.
• Better service to the customers.
• Reduction of the load on the host computer.
• Reduction of delays in data processing.

Network operating System


A Network Operating System runs on a server and provides the server the capability to
manage data, users, groups, security, applications, and other networking functions. The
primary purpose of the network operating system is to allow shared file and printer
access among multiple computers in a network, typically a local area network (LAN), a
private network or to other networks.
Examples of network operating systems include Microsoft Windows Server 2003,
Microsoft Windows Server 2008, UNIX, Linux, Mac OS X, Novell NetWare, and BSD.
The advantages of network operating systems are as follows −

• Centralized servers are highly stable.


• Security is server managed.
• Upgrades to new technologies and hardware can be easily integrated into the
system.
• Remote access to servers is possible from different locations and types of
systems.
The disadvantages of network operating systems are as follows −

• High cost of buying and running a server.


• Dependency on a central location for most operations.
• Regular maintenance and updates are required.

Real Time operating System


A real-time system is defined as a data processing system in which the time interval
required to process and respond to inputs is so small that it controls the environment.
The time taken by the system to respond to an input and display of required updated
information is termed as the response time. So in this method, the response time is very
less as compared to online processing.
Real-time systems are used when there are rigid time requirements on the operation of
a processor or the flow of data and real-time systems can be used as a control device in
a dedicated application. A real-time operating system must have well-defined, fixed
time constraints, otherwise the system will fail. For example, Scientific experiments,
medical imaging systems, industrial control systems, weapon systems, robots, air traffic
control systems, etc.
There are two types of real-time operating systems.

Hard real-time systems


Hard real-time systems guarantee that critical tasks complete on time. In hard real-time
systems, secondary storage is limited or missing and the data is stored in ROM. In these
systems, virtual memory is almost never found.

Soft real-time systems


Soft real-time systems are less restrictive. A critical real-time task gets priority over
other tasks and retains the priority until it completes. Soft real-time systems have limited
utility than hard real-time systems. For example, multimedia, virtual reality, Advanced
Scientific Projects like undersea exploration and planetary rovers, etc.

Operating System Structure


Overview
An operating system is a design that enables user application programs to communicate
with the hardware of the machine. The operating system should be built with the utmost
care because it is such a complicated structure and should be simple to use and modify.
Partially developing the operating system is a simple approach to accomplish this. Each
of these components needs to have distinct inputs, outputs, and functionalities.

This article discusses many sorts of structures that implement operating systems, as listed
below, as well as how and why they work. It also defines the operating system structure.

o Simple Structure
o Monolithic Structure
o Layered Approach Structure
o Micro-Kernel Structure
o Exo-Kernel Structure
o Virtual Machines

What is an operating System Structure?


We want a clear structure to let us apply an operating system to our particular needs
because operating systems have complex structures. It is easier to create an operating
system in pieces, much as we break down larger issues into smaller, more manageable
subproblems. Every segment is also a part of the operating system. Operating system
structure can be thought of as the strategy for connecting and incorporating various
operating system components within the kernel. Operating systems are implemented
using many types of structures, as will be discussed below:

SIMPLE STRUCTURE
It is the most straightforward operating system structure, but it lacks definition and is only
appropriate for usage with tiny and restricted systems. Since the interfaces and degrees of
functionality in this structure are clearly defined, programs are able to access I/O routines,
which may result in unauthorized access to I/O procedures.

This organizational structure is used by the MS-DOS operating system:

o There are four layers that make up the MS-DOS operating system, and each has its own
set of features.
o These layers include ROM BIOS device drivers, MS-DOS device drivers, application
programs, and system programs.
o The MS-DOS operating system benefits from layering because each level can be defined
independently and, when necessary, can interact with one another.
o If the system is built in layers, it will be simpler to design, manage, and update. Because of
this, simple structures can be used to build constrained systems that are less complex.
o When a user program fails, the operating system as whole crashes.
o Because MS-DOS systems have a low level of abstraction, programs and I/O procedures
are visible to end users, giving them the potential for unwanted access.

The following figure illustrates layering in simple structure:

Advantages of Simple Structure:

o Because there are only a few interfaces and levels, it is simple to develop.
o Because there are fewer layers between the hardware and the applications, it offers
superior performance.

Disadvantages of Simple Structure:

o The entire operating system breaks if just one user program malfunctions.
o Since the layers are interconnected, and in communication with one another, there is no
abstraction or data hiding.
o The operating system's operations are accessible to layers, which can result in data
tampering and system failure.

MONOLITHIC STRUCTURE
The monolithic operating system controls all aspects of the operating system's operation,
including file management, memory management, device management, and operational
operations.

The core of an operating system for computers is called the kernel (OS). All other System
components are provided with fundamental services by the kernel. The operating system
and the hardware use it as their main interface. When an operating system is built into a
single piece of hardware, such as a keyboard or mouse, the kernel can directly access all
of its resources.

The monolithic operating system is often referred to as the monolithic kernel. Multiple
programming techniques such as batch processing and time-sharing increase a
processor's usability. Working on top of the operating system and under complete
command of all hardware, the monolithic kernel performs the role of a virtual computer.
This is an old operating system that was used in banks to carry out simple tasks like batch
processing and time-sharing, which allows numerous users at different terminals to access
the Operating System.

The following diagram represents the monolithic structure:


Advantages of Monolithic Structure:

o Because layering is unnecessary and the kernel alone is responsible for managing all
operations, it is easy to design and execute.
o Due to the fact that functions like memory management, file management, process
scheduling, etc., are implemented in the same address area, the monolithic kernel runs
rather quickly when compared to other systems. Utilizing the same address speeds up and
reduces the time required for address allocation for new processes.

Disadvantages of Monolithic Structure:

o The monolithic kernel's services are interconnected in address space and have an impact
on one another, so if any of them malfunctions, the entire system does as well.
o It is not adaptable. Therefore, launching a new service is difficult.
LAYERED STRUCTURE
The OS is separated into layers or levels in this kind of arrangement. Layer 0 (the lowest
layer) contains the hardware, and layer 1 (the highest layer) contains the user interface
(layer N). These layers are organized hierarchically, with the top-level layers making use of
the capabilities of the lower-level ones.

The functionalities of each layer are separated in this method, and abstraction is also an
option. Because layered structures are hierarchical, debugging is simpler, therefore all
lower-level layers are debugged before the upper layer is examined. As a result, the
present layer alone has to be reviewed since all the lower layers have already been
examined.

The image below shows how OS is organized into layers:

Advantages of Layered Structure:

o Work duties are separated since each layer has its own functionality, and there is some
amount of abstraction.
o Debugging is simpler because the lower layers are examined first, followed by the top
layers.

Disadvantages of Layered Structure:

o Performance is compromised in layered structures due to layering.


o Construction of the layers requires careful design because upper layers only make use of
lower layers' capabilities.

MICRO-KERNEL STRUCTURE
The operating system is created using a micro-kernel framework that strips the kernel of
any unnecessary parts. Systems and user applications are used to implement these optional
kernel components. So, Micro-Kernels is the name given to these systems that have been
developed.

Each Micro-Kernel is created separately and is kept apart from the others. As a result, the
system is now more trustworthy and secure. If one Micro-Kernel malfunctions, the
remaining operating system is unaffected and continues to function normally.

The image below shows Micro-Kernel Operating System Structure:


Advantages of Micro-Kernel Structure:

o It enables portability of the operating system across platforms.


o Due to the isolation of each Micro-Kernel, it is reliable and secure.
o The reduced size of Micro-Kernels allows for successful testing.
o The remaining operating system remains unaffected and keeps running properly even if a
component or Micro-Kernel fails.

Disadvantages of Micro-Kernel Structure:

o The performance of the system is decreased by increased inter-module communication.


o The construction of a system is complicated.

EXOKERNEL
An operating system called Exokernel was created at MIT with the goal of offering
application-level management of hardware resources. The exokernel architecture's goal
is to enable application-specific customization by separating resource management from
protection. Exokernel size tends to be minimal due to its limited operability.

Because the OS sits between the programs and the actual hardware, it will always have an
effect on the functionality, performance, and breadth of the apps that are developed on
it. By rejecting the idea that an operating system must offer abstractions upon which to
base applications, the exokernel operating system makes an effort to solve this issue. The
goal is to give developers as few restriction on the use of abstractions as possible while
yet allowing them the freedom to do so when necessary. Because of the way the exokernel
architecture is designed, a single tiny kernel is responsible for moving all hardware
abstractions into unreliable libraries known as library operating systems. Exokernels differ
from micro- and monolithic kernels in that their primary objective is to prevent forced
abstraction.

Exokernel operating systems have a number of features, including:

o Enhanced application control support.


o Splits management and security apart.
o A secure transfer of abstractions is made to an unreliable library operating system.
o Brings up a low-level interface.
o Operating systems for libraries provide compatibility and portability.

Advantages of Exokernel Structure:

o Application performance is enhanced by it.


o Accurate resource allocation and revocation enable more effective utilisation of hardware
resources.
o New operating systems can be tested and developed more easily.
o Every user-space program is permitted to utilise its own customised memory
management.

Disadvantages of Exokernel Structure:

o A decline in consistency
o Exokernel interfaces have a complex architecture.
VIRTUAL MACHINES (VMs)
The hardware of our personal computer, including the CPU, disc drives, RAM, and NIC
(Network Interface Card), is abstracted by a virtual machine into a variety of various
execution contexts based on our needs, giving us the impression that each execution
environment is a separate computer. A virtual box is an example of it.

Using CPU scheduling and virtual memory techniques, an operating system allows us to
execute multiple processes simultaneously while giving the impression that each one is
using a separate processor and virtual memory. System calls and a file system are
examples of extra functionalities that a process can have that the hardware is unable to
give. Instead of offering these extra features, the virtual machine method just offers an
interface that is similar to that of the most fundamental hardware. A virtual duplicate of
the computer system underneath is made available to each process.

We can develop a virtual machine for a variety of reasons, all of which are fundamentally
connected to the capacity to share the same underlying hardware while concurrently
supporting various execution environments, i.e., various operating systems.

Disk systems are the fundamental problem with the virtual machine technique. If the
actual machine only has three-disc drives but needs to host seven virtual machines, let's
imagine that. It is obvious that it is impossible to assign a disc drive to every virtual
machine because the program that creates virtual machines would require a sizable
amount of disc space in order to offer virtual memory and spooling. The provision of
virtual discs is the solution.

The result is that users get their own virtual machines. They can then use any of the
operating systems or software programs that are installed on the machine below. Virtual
machine software is concerned with programming numerous virtual machines
simultaneously into a physical machine; it is not required to take into account any user-
support software. With this configuration, it may be possible to break the challenge of
building an interactive system for several users into two manageable chunks.

Advantages of Virtual Machines:

o Due to total isolation between each virtual machine and every other virtual machine, there
are no issues with security.
o A virtual machine may offer an architecture for the instruction set that is different from
that of actual computers.
o Simple availability, accessibility, and recovery convenience.
Disadvantages of Virtual Machines:

o Depending on the workload, operating numerous virtual machines simultaneously on a


host computer may have an adverse effect on one of them.
o When it comes to hardware access, virtual computers are less effective than physical ones.

CONCLUSION
o The operating system makes it possible for the user to communicate with the hardware of
the computer. The operating system is used as the foundation for installing and using
system software.
o The interconnections between the various operating system components can be defined
as the operating system structure.
o The operating system is divided into various different structural types: simple structure,
monolithic approach, layered approach, micro-kernels, exokernels, and virtual machines.
o Each time one of these methods or structures changed, the OS became progressively
better.

System Call
o A system call is a mechanism that provides the interface between a
process and the operating system. It is a programmatic method in
which a computer program requests a service from the kernel of the
OS.
o System call offers the services of the operating system to the user
programs via API (Application Programming Interface). System calls
are the only entry points for the kernel system.
o

Example of System Call


For example if we need to write a program code to read data from one file,
copy that data into another file. The first information that the program
requires is the name of the two files, the input and output files.

In an interactive system, this type of program execution requires some


system calls by OS.

• First call is to write a prompting message on the screen


• Second, to read from the keyboard, the characters which define the
two files.

How System Call Works?


Here are the steps for System Call in OS:
Architecture of the System Call
As you can see in the above-given System Call example diagram.

Step 1) The processes executed in the user mode till the time a system call
interrupts it.

Step 2) After that, the system call is executed in the kernel-mode on a


priority basis.

Step 3) Once system call execution is over, control returns to the user
mode.,

Step 4) The execution of user processes resumed in Kernel mode.

Why do you need System Calls in OS?


Following are situations which need system calls in OS:

• Reading and writing from files demand system calls.


• If a file system wants to create or delete files, system calls are
required.
• System calls are used for the creation and management of new
processes.
• Network connections need system calls for sending and receiving
packets.
• Access to hardware devices like scanner, printer, need a system call.

Types of System calls


Here are the five types of System Calls in OS:

• Process Control
• File Management
• Device Management
• Information Maintenance
• Communications

Types of System calls in OS


Process Control
This system calls perform the task of process creation, process
termination, etc.

Functions:

• End and Abort


• Load and Execute
• Create Process and Terminate Process
• Wait and Signal Event
• Allocate and free memory

File Management
File management system calls handle file manipulation jobs like creating a
file, reading, and writing, etc.

Functions:

• Create a file
• Delete file
• Open and close file
• Read, write, and reposition
• Get and set file attributes

Device Management
Device management does the job of device manipulation like reading from
device buffers, writing into device buffers, etc.

Functions:

• Request and release device


• Logically attach/ detach devices
• Get and Set device attributes
Information Maintenance
It handles information and its transfer between the OS and the user
program.

Functions:

• Get or set time and date


• Get process and device attributes

Communication:
These types of system calls are specially used for interprocess
communications.

Functions:

• Create, delete communications connections


• Send, receive message
• Help OS to transfer status information
• Attach or detach remote devices

Rules for passing Parameters for System Call


Here are general common rules for passing parameters to the System Call:

• Parameters should be pushed on or popped off the stack by the


operating system.
• Parameters can be passed in registers.
• When there are more parameters than registers, it should be stored in
a block, and the block address should be passed as a parameter to a
register.

Important System Calls Used in OS


wait()
In some systems, a process needs to wait for another process to complete
its execution. This type of situation occurs when a parent process creates a
child process, and the execution of the parent process remains suspended
until its child process executes.

The suspension of the parent process automatically occurs with a wait()


system call. When the child process ends execution, the control moves
back to the parent process.

fork()
Processes use this system call to create processes that are a copy of
themselves. With the help of this system Call parent process creates a child
process, and the execution of the parent process will be suspended till the
child process executes.

exec()
This system call runs when an executable file in the context of an already
running process that replaces the older executable file. However, the
original process identifier remains as a new process is not built, but stack,
data, head, data, etc. are replaced by the new process.

kill():
The kill() system call is used by OS to send a termination signal to a
process that urges the process to exit. However, a kill system call does not
necessarily mean killing the process and can have various meanings.

exit():
The exit() system call is used to terminate program execution. Specially in
the multi-threaded environment, this call defines that the thread
execution is complete. The OS reclaims resources that were used by the
process after the use of exit() system call.
Summary:
Categories Windows Unix

CreateProcess() fork()
Process control ExitProcess() exit()
WaitForSingleObject() wait()

SetConsoleMode() loctl()
Device
ReadConsole() read()
manipulation
WriteConsole() write()

CreateFile() Open()
File ReadFile() Read()
manipulation WriteFile() write()
CloseHandle() close!)

GetCurrentProcessID() getpid()
Information
SetTimer() alarm()
maintanence
Sleep() sleep()

CreatePipe() Pipe()
Communication CreateFileMapping() shm_open()
MapViewOfFile() mmap()

SetFileSecurity()
Chmod()
InitlializeSecurityDescriptor()
Protection Umask()
SetSecurityDescriptorGroup
Chown()
()

You might also like