1.以下说法错误的是:
A.无名管道的描述符只能通过继承的方式获得,因此没有亲缘关系的进程间无法使用无名管道通信。
B.有名管道可以被多个进程打开,而且同时写入数据时数据不会被破坏。
C.无名管道和有名管道都只存在于进程上下文之中,退出了进程管道即消失。
D.管道内部的数据如果填满了缓冲区,继续写入数据会导致阻塞。
A正确。无名管道是用于有亲缘关系的进程之间的通信(通常是父子进程之间),因为管道描述符是通过fork系统 调用继承的。
B正确。有名管道(FIFO)是系统中的一个特殊文件,可以被多个进程打开进行读写。系统会保证写操作的原子 性,避免数据混乱。
C错误。无名管道确实只存在于进程上下文中,但有名管道(FIFO)存在于文件系统中,不依赖于进程的生存周 期,即使所有进程都退出,有名管道依然存在,直到被显式删除。
D正确。当管道的缓冲区被填满时,写入操作会被阻塞,直到有数据被读出或缓冲区有空间。
2.以下叙述正确的是:
A.一个进程可以同时响应多个相同的信号。
B.信号在响应的过程中可以响应别的信号。
C.对一个信号设置了阻塞,就意味着将来收到此信号会将其丢弃。
D.可以给一个进程发送信号,但无法给一个进程组发送信号。
E.信号响应函数跟主函数的执行是串行的,因此不需要保护该函数内的共享资源。
A错误。对于大多数信号,一个进程在某一时刻只能处理一个该类型的信号,未处理的相同信号会被合并为一个信 号,不会同时存在多个相同信号在信号队列中。
B正确。信号处理函数在处理一个信号时,如果不屏蔽其他信号,那么其他信号仍然可以中断当前的信号处理函 数,从而触发对这些新信号的处理。
C错误。阻塞一个信号只是让该信号在阻塞期间不被处理,并不会丢弃。当解除阻塞时,阻塞期间收到的信号会被 处理。
D错误。可以通过
kill
函数发送信号给一个进程组。使用负的进程组ID可以给整个进程组发送信号。E错误。信号处理函数的执行是异步的,与主函数执行是并行的。因为信号处理函数可能会在任何时候中断主函数 的执行,因此必须保护共享资源(例如使用信号屏蔽或其他同步机制)以避免竞态条件。
3.关于共享内存,叙述有误的是:
A.共享内存之一块直接暴露在多个进程中的内存,因此必须使用同步互斥机制来加以保护。
B.共享内存是诸多IPC中效率最高的一种,适合于传输大量数据。
C.在共享内存中定义的变量别的进程可以访问,但如果加以修改则会自动复制一个拷贝,不影响原数据。
D.进程在使用共享内存前,必须先将其映射到自己的虚拟空间来。
A正确。因为共享内存可以同时被多个进程访问,所以需要同步和互斥机制(例如信号量、互斥锁)来防止数据竞 争和不一致性。
B正确。共享内存不涉及内核态与用户态之间的数据复制,因此在需要高效地传输大量数据时非常合适。
C错误。共享内存是直接共享的,所有进程都能看到并修改同一块内存,修改会直接影响到原数据,不会自动复制 一个拷贝。
D正确。进程需要通过系统调用将共享内存段映射到自己的地址空间才能使用。
4.关于进程的状态,以下说法错误的是:
A.新建的进程处于TASK_RUNNING状态,可以随时被调度器调度。
B.正常退出的进程将会进入EXIT_ZOMBIE状态,异常被杀死的进程则直接进入EXIT_DEAD状态。
C.进程可以调用sleep()来强迫自己进入TASK_INTERRUPIBLE状态。
D.分时系统的提出的根本原因是CPU资源稀缺。
E.处于TASK_STOPPED状态的进程收到SIGCONT后将进入睡眠态,等待唤醒之后重新调度。
A正确。新建的进程在被创建后确实是处于TASK_RUNNING状态,表示它已经准备好被调度执行。
B错误。不论进程是正常退出还是异常被杀死,都会首先进入EXIT_ZOMBIE状态,只有当父进程通过wait系统调用 回收它的资源后,进程才会进入EXIT_DEAD状态。
C正确。调用sleep()函数会使进程进入TASK_INTERRUPIBLE状态,在指定的时间到达或接收到信号时被唤醒。
D正确。分时系统是为了更有效地利用CPU资源,使多个用户或任务能共享CPU时间,提高系统效率。
E错误。处于TASK_STOPPED状态的进程在收到SIGCONT信号后,会从TASK_STOPPED状态变为TASK_RUNNING状 态,等待调度器调度执行。
5.关于异步信号通信机制,以下说法错误的是:
A.signal()用以给某信号指定一个关联响应函数,kill()用以给某进程发送某一个信号。
B.如果进程在注册某信号处理函数之前就收到该信号,那么该信号将会被保留起来直至有了其响应函数为止。
C.信号的标记从1号到64号,标号越小的信号优先级越高,高优先级信号的响应过程将不会被低优先级信号中断。
D.一个进程可以设置阻塞信号掩码,但这些阻塞掩码将不会继承给其子进程。
E.如果一个进程内有多条线程,那么当该进程收到一个信号的时候,无法确定哪条线程会响应该信号。
F.线程可以单独设置信号阻塞掩码,但是线程之间共享信号处理函数。
A正确。
signal()
函数用于设置信号处理函数,kill()
函数用于向某个进程发送信号。B错误。如果在注册信号处理函数之前收到信号,该信号不会被保留,将按照默认处理方式处理或被忽略。
C错误。信号的编号与优先级无关,并且信号处理过程可以被其他信号打断,信号的优先级不由编号决定。
D错误。信号阻塞掩码是可以继承给子进程的,子进程会继承父进程的信号阻塞掩码。
E正确。线程环境中,进程收到信号后,具体由哪个线程处理该信号是不确定的。
F正确。每个线程可以有自己的信号阻塞掩码,但信号处理函数是进程级的,所有线程共享。
6.以下说法错误的是:
A.使用semget()产生的信号量是系统对象,由内核维护,用一个key来识别,适用于进程间同步。
B.使用sem_t定义的信号量是进程变量,由进程本身维护,适用于进城内部的各线程间同步。
C.当信号量只能取0和1时,其作用相当于互斥锁。
D.一个进程在进入临界区的时候即使不加锁,理论上也能继续运行,而不会有任何语法限制。
E.读写锁将临界代码对共享资源的访问细分为读和写,在某些场合能明显地改善互斥锁的效率。
F.条件变量是一种复杂的同步机制,他必须与信号量一起配套使用。
A正确。
semget()
函数用于创建或获取一个由内核维护的信号量集,可以用于进程间同步。B正确。
sem_t
类型的信号量是POSIX标准的,通常用于线程间同步。C正确。二进制信号量(只能取0和1)在功能上类似于互斥锁,用于保护临界区。
D正确。加锁是为了保护临界区内的数据一致性和避免竞态条件,但在语法上没有强制要求。
E正确。读写锁允许多个线程同时读取,但写操作是独占的,这在读多写少的场景中效率更高。
F错误。条件变量通常与互斥锁(而不是信号量)一起使用。条件变量用于线程间的等待和通知机制,互斥锁保护 共享资源。
7.以下对信号的理解不正确的是:
A.信号是一种异步通信方式
B.信号只用在用户空间进程通信,不能和内核空间交互
C.信号是可以被屏蔽的
D.信号是通过软中断实现的
标签:常见,正确,编程,阻塞,概念,线程,信号,进程,函数 From: https://www.cnblogs.com/lwj294/p/18230834A正确。信号是一种异步事件通知机制,用于进程之间或进程与操作系统内核之间的通信。
B错误。信号不仅用于用户空间的进程间通信,也可以用于用户进程与内核之间的交互。例如,某些硬件事件或内 核中的异常情况会向用户进程发送信号。
C正确。进程可以设置信号屏蔽字来屏蔽特定的信号,从而暂时阻止该信号的处理。
D正确。信号的处理机制类似于软中断,当信号到达时,内核会打断当前的执行流,转而执行信号处理函数。