进程三态与五态是什么?

进程状态反映进程执行过程的变化。这些状态随着进程的执行和外界条件的变化而转换。
三态模型中,进程状态分为三个基本状态,即就绪态,运行态,阻塞态。
五态模型中,进程分为新建态、就绪态,运行态,阻塞态,终止态。

进程状态转换的三态模型:

运行态(Running):进程占有处理器正在(Running)运行。即进程正在执行。当时间片结束后,运行态转换为就绪态,等待CPU等资源的分配

就绪态(Ready):进程具备运行条件,等待系统分配处理器以便运行。当进程已分配到除CPU以外的所有必要资源后,只要再获得CPU,便可立即执行,即到达运行态。在一个系统中处于就绪状态的进程可能有多个,通常将它们排成一个队列,称为就绪队列

阻塞态(Block):又称为等待(wait)态或睡眠(sleep)态,指进程不具备运行条件,正在等待某个事件的完成。如运行程序在等待用户输入时,即进入阻塞态。

(补充)时间片轮转RR进程调度算法:用于分时系统中的进程调度。每次调度时,总是选择就绪队列的队首进程,让其在CPU上运行一个系统预先设置好的时间片。一个时间片内没有完成运行的进程,返回到绪队列末尾重新排队,等待下一次调度。

进程状态转换的五态模型:

新建态:进程刚被创建时的状态,尚未进入就绪队列。
创建一个进程要经过以下几步:

  • 首先进程申请一个空白PCB,并向PCB中填写用于控制和管理进程的信息
  • 然后为该进程分配运行时所必须的资源
  • 最后把该进程转入就绪状态并插入就绪队列
    引入创建状态是为了保证进程的调度必须是在创建工作完成之后

终止态:进程完成任务到达正常结束点,或出现无法克服的错误而异常终止,或被操作系统及有终止权的进程所终止时所处的状态。进入终止态的进程以后不再执行,但依然保留在操作系统中等待善后。一旦其他进程完成了对终止态进程的信息抽取之后,操作系统将删除该进程。
进程的终止状态有以下两步:

  • 首先,等待操作系统做善后处理
  • 最后将其PCB清零,并将PCB空间返还给系统

(补充)进程控制块PCB
PCB作为进程实体的一部分,记录操作系统所需的用于描述进程的当前情况以及管理进程运行的全部信息,是操作系统中最重要的记录型数据结构。我们认为,创建进程就是创建一个PCB,销毁进程也就是销毁进程的PCB。它的作用是使一个能在多道程序环境下不能独立运行的程序称为一个能独立运行的基本单位,一个能与其他进程并发执行的进程。

 

 

凌云面试自查(操作系统) 1.Linux基础 1.1Linux 如何查看磁盘分区大小, 如何查看、修改网卡配 置 1.2如何修改网卡的IP、子网掩码、默认网关、DNS 1.3查看当前操作系统内核信息 1.4当前操作系统版本信息 1.5查看内存信息 1.6查看进程占用的文件 1.7查看进程占用的地址空间 1.8查看cpu,以及系统硬件信息 1.9查找所有.c文件中含有“hello world”的文件 1.10操作系统大功能 1.11进程调度有哪些调度算法 1.12内存管理有哪些调度算法 1.13什么是软链接, 什么是硬链接 1.14什么是可重入函数, 不可重入函数? 哪些原因导致函数 不可重入? 1.15.gdb是什么? 怎么使用的? 1.16.linux下有哪些设备? 1.17.什么是VFS(虚拟文件系统)? 1.18.什么是块设备和字符设备和网络设备? 2.APUE 2.1.什么是文件IO, IO常用的系统调用有哪些? 如何实现 文件拷贝? 2.2.系统调用(系统API, 文件IO)和标准IO(库函数)有什么区 别? 什么是缓冲、缓冲有哪些 2.3.么是同步, 异步? 什么是阻塞和非阻塞? 2.4. 怎么将socket设置为阻塞/非阻塞模式? 2.5.说一下种I/O模型? (不是select, poll, epoll) 2.6. 描述select, poll, epoll的工作原理及区别? 2.7.什么是内核和用户? 内核到用户的转换 3.多进程多线程 3.1. 进程和线程的概念 3.2. 线程和进程有什么区别 3.3. 什么时候使用多进程, 什么时候使用多线程 3.4.进程三态是什么? 3.5. 创建进程有哪些方式(了解即可) 3.6.什么是进程上下文中断上下文? 3.7.fork和vfork有什么区别? 为什么又fork还要vfork? 3.8.什么是写时拷贝技术? 3.9.什么是孤儿进程, 什么是僵尸进程, 如何避免产生僵 尸进程? 3.10.如何知道进程和线程是否已经退出? 3.11.一个系统最大可以启动多少个线程? 怎么设置线程的 优先级? 3.12.多线程为什么要设置属性, 为什么设置栈的大小? 3.13.线程的堆栈大小要怎么设置, 默认是多少, 最小是多少? 3.14.怎么保证主线程创建的子线程先执行? 线程间通信有 哪些方式? 3.15.什么是线程的同步互斥? 互斥锁, 条件变量和信号量 的区别? 3.16.什么是临界区, 什么是临界资源? 3.17.什么是线程池? 3.18. 进程间通信有几种? 3.19.什么是死锁? 死锁产生的原因? 死锁的产生有哪些条 件? 怎么解决死锁? 3.20.线程间怎么进行通信以及同步 3.21.线程同步实现的方式? 3.22.Linux 内核中有哪几种锁; 自旋锁互斥锁有什么区 别? 3.23.条件变量和信号量的区别 3.24.条件变量和互斥锁为什么要配合使用 3.25信号信号量的区别 4.BSP 4.1描述一下字符设备驱动编写的流程 4.2什么是中断的上半部, 什么是中断的下半部? 4.3.中断的下半部有哪些实现机制? 4.4.Linux 系统启动流程及U-boot
最新发布
09-11
### Linux基础 #### 查看磁盘分区大小 可以使用`df -h`命令查看文件系统磁盘使用情况,以人类可读的方式显示磁盘分区大小;使用`fdisk -l`查看磁盘分区表信息;还可以使用`du -sh`查看目录占用磁盘空间大小,若要查看目录下所有文件和子目录大小可使用`du -h`。对于GPT分区,完成分区操作后若使用`fdisk -l`打印分区表可能会出现警告信息,这是正常的 [^2][^3]。 ```bash df -h fdisk -l du -sh /path/to/directory ``` #### 网卡配置修改 在Linux中,网卡配置文件通常位于`/etc/sysconfig/network-scripts/`目录下,以`ifcfg-`开头。可以使用文本编辑器(如`vi`或`nano`)修改该文件,修改完成后使用`systemctl restart network`命令重启网络服务使配置生效。 ```bash vi /etc/sysconfig/network-scripts/ifcfg-eth0 systemctl restart network ``` #### 内核及系统版本信息 使用`uname -r`查看内核版本,使用`cat /etc/os-release`查看系统版本信息。 ```bash uname -r cat /etc/os-release ``` #### 内存信息 使用`free -h`查看系统内存使用情况,以人类可读的方式显示;使用`top`或`htop`命令可以实时查看系统内存及其他资源使用情况。 ```bash free -h top ``` #### 进程占用信息 使用`ps -ef`查看所有进程信息,使用`top`或`htop`实时监控进程资源占用情况,使用`pstree`查看进程树结构。 ```bash ps -ef top pstree ``` #### 硬件信息 使用`lshw`查看硬件详细信息,使用`lspci`查看PCI设备信息,使用`lsusb`查看USB设备信息。 ```bash lshw lspci lsusb ``` #### 查找特定文件 使用`find`命令查找文件,如`find / -name "filename"`在根目录下查找名为`filename`的文件;使用`grep`命令结合`find`可以进一步筛选文件内容。 ```bash find / -name "filename" find / -name "*.txt" | xargs grep "keyword" ``` #### 操作系统功能 操作系统的功能包括处理机管理、存储器管理、设备管理、文件管理等。其中,内存管理是操作系统设计中最重要和最复杂的内容之一,它主要包括内存空间的分配回收、地址转换、内存空间的扩充、内存共享和存储保护等功能 [^1]。 #### 调度算法 常见的调度算法有先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)、优先级调度算法、多级反馈队列调度算法等。 #### 链接概念 链接分为硬链接和符号链接。硬链接是指多个文件名指向同一个inode节点,删除其中一个文件名不影响其他文件名对文件的访问;符号链接是一个特殊文件,它指向另一个文件或目录,类似于Windows中的快捷方式。在使用`du`命令统计目录占用磁盘空间时,默认不统计链接文件,需要使用`-l`和`-L`选项特地指出来 [^2]。 #### gdb使用 `gdb`是一个强大的调试工具,可用于调试C、C++等程序。基本使用步骤包括启动`gdb`、加载可执行文件、设置断点、运行程序、单步执行等。 ```bash gdb program (gdb) break main (gdb) run (gdb) next ``` #### 设备类型 Linux系统中设备类型主要分为字符设备、块设备和网络设备。字符设备以字符为单位进行数据传输,如键盘、鼠标等;块设备以块为单位进行数据传输,如硬盘、U盘等;网络设备用于网络通信,如网卡。 #### VFS 虚拟文件系统(VFS)是Linux内核中的一个抽象层,它为用户程序提供了统一的文件系统接口,使得用户程序可以使用相同的系统调用访问不同类型的文件系统。 ### APUE #### 文件IO 文件IO包括系统调用级别的文件IO和标准IO。系统调用级别的文件IO使用`open`、`read`、`write`、`close`等系统调用,直接内核交互;标准IO使用`fopen`、`fread`、`fwrite`、`fclose`等库函数,提供了更高级的缓冲机制。 #### 系统调用标准IO区别 系统调用是操作系统提供的接口,直接内核交互,效率较高但使用相对复杂;标准IO是C标准库提供的接口,提供了缓冲机制,使用方便但效率相对较低。 #### 同步异步及阻塞非阻塞概念 同步是指在执行IO操作时,程序必须等待IO操作完成才能继续执行;异步是指程序发起IO操作后可以继续执行其他任务,IO操作完成后会通过回调或信号通知程序。阻塞是指在执行IO操作时,程序会一直等待直到IO操作完成;非阻塞是指在执行IO操作时,若IO操作不能立即完成,程序会立即返回,不会等待。 #### socket模式设置 socket可以设置为阻塞模式和非阻塞模式。在阻塞模式下,`accept`、`recv`等操作会一直阻塞直到有数据到达或连接建立;在非阻塞模式下,这些操作会立即返回,若没有数据到达或连接建立会返回错误。 ```c #include <fcntl.h> #include <sys/socket.h> // 设置socket为非阻塞模式 int flags = fcntl(sockfd, F_GETFL, 0); fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); ``` #### I/O模型 常见的I/O模型有阻塞I/O、非阻塞I/O、多路复用I/O(如`select`、`poll`、`epoll`)、信号驱动I/O和异步I/O。 #### 内核用户 内核是操作系统内核运行的状,具有最高的权限,可以访问系统的所有资源;用户是用户程序运行的状,权限较低,只能访问自己的地址空间。当用户程序需要访问系统资源时,需要通过系统调用进入内核。 ### 多进程多线程 #### 进程线程概念及区别 进程是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位;线程是进程中的一个执行单元,是CPU调度和分派的基本单位。进程拥有自己独立的内存空间和系统资源,而线程共享进程的内存空间和系统资源。 #### 使用场景 进程适用于需要独立资源和隔离性的场景,如不同的应用程序;线程适用于需要并发执行且共享资源的场景,如一个应用程序中的多个任务。 #### 状 进程的状包括创建、就绪、运行、阻塞、终止等;线程的状进程类似,也有就绪、运行、阻塞等状。 #### 创建方式 在Linux中,可以使用`fork`系统调用创建子进程,使用`pthread_create`函数创建线程。 ```c #include <unistd.h> #include <pthread.h> // 创建子进程 pid_t pid = fork(); if (pid == 0) { // 子进程代码 } else if (pid > 0) { // 父进程代码 } // 创建线程 void *thread_function(void *arg) { // 线程代码 return NULL; } pthread_t thread_id; pthread_create(&thread_id, NULL, thread_function, NULL); ``` #### 上下文 进程上下文包括进程的代码、数据、寄存器值、程序计数器等信息;线程上下文包括线程的寄存器值、程序计数器等信息。 #### 写时拷贝 写时拷贝(Copy-on-Write,COW)是一种优化技术,在`fork`创建子进程时,子进程和父进程共享物理内存页面,只有当其中一个进程需要修改页面内容时,才会复制一份页面。 #### 孤儿僵尸进程 孤儿进程是指父进程先于子进程终止,子进程成为孤儿进程后会被`init`进程收养;僵尸进程是指子进程终止后,父进程没有调用`wait`或`waitpid`回收子进程的资源,子进程成为僵尸进程。 #### 线程退出判断 可以使用`pthread_join`函数等待线程退出,并获取线程的返回值;也可以使用`pthread_kill`函数向线程发送信号来终止线程。 #### 线程属性及堆栈设置 可以使用`pthread_attr_init`、`pthread_attr_setstacksize`等函数设置线程的属性和堆栈大小。 ```c pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setstacksize(&attr, 1024 * 1024); // 设置堆栈大小为1MB pthread_create(&thread_id, &attr, thread_function, NULL); ``` #### 线程同步互斥 线程同步互斥的方法包括互斥锁、信号量、条件变量等。互斥锁用于保护共享资源,同一时间只允许一个线程访问;信号量可以用于控制多个线程对共享资源的访问数量;条件变量用于线程间的同步,当某个条件满足时,线程可以被唤醒。 #### 通信方式 进程间通信(IPC)方式包括管道、消息队列、共享内存、信号量等;线程间通信可以通过共享全局变量、使用信号量、条件变量等方式。 #### 死锁问题 死锁是指多个进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象。死锁产生的四个必要条件是互斥条件、请求和保持条件、不剥夺条件和循环等待条件。避免死锁的方法包括破坏死锁产生的必要条件、使用资源分配图算法等。 #### 内核锁类型 内核锁类型包括自旋锁、信号量、读写锁等。自旋锁在获取锁失败时会一直自旋等待,适用于锁持有时间较短的场景;信号量在获取锁失败时会进入睡眠状,适用于锁持有时间较长的场景;读写锁允许多个线程同时进行读操作,但在写操作时会互斥。 ### BSP #### 字符设备驱动编写流程 字符设备驱动编写流程包括定义设备结构体、实现设备操作函数(如`open`、`read`、`write`、`release`等)、注册字符设备驱动、创建设备节点等。 #### 中断上下半部及实现机制 中断处理分为上半部和下半部。上半部处理紧急的中断任务,如保存寄存器值、清除中断标志等,执行速度快且不允许被中断;下半部处理不紧急的中断任务,如数据处理、设备驱动的后续操作等,可以被中断。实现机制包括软中断、tasklet和工作队列等。 #### Linux系统启动流程及U-boot Linux系统启动流程一般包括BIOS/UEFI启动、引导加载程序(如U-boot)启动、内核加载、根文件系统挂载、init进程启动等阶段。U-boot是一个开源的引导加载程序,用于在嵌入式系统中加载和启动Linux内核。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值