找到关于操作系统的2047篇文章

进程在内存中是什么样的?

Arnab Chakraborty
更新于 2019年10月11日 13:04:47

4K+ 浏览量

加载到内存并执行的程序称为进程。简单来说,进程就是正在执行的程序。当创建程序时,它只是一些存储在硬盘上的被动实体字节。然后程序开始加载到内存中并成为一个活动实体,当在Windows中双击程序或在命令行中输入可执行文件的名称时。(例如a.out或prog.exe)让我们看看每个内存段以及进程在内存中的样子——图:内存中的进程进程不仅仅是…… 阅读更多

使用互斥锁的死锁

Arnab Chakraborty
更新于 2019年10月11日 13:01:45

6K+ 浏览量

死锁可能发生在使用互斥锁的多线程Pthread程序中。让我们看看它是如何发生的。未锁定的互斥锁由pthread_mutex_init()函数初始化。使用pthread_mutex_lock()和pthread_mutex_unlock()获取和释放互斥锁。如果线程尝试获取锁定的互斥锁,则对pthread_mutex_lock()的调用会阻塞线程,直到互斥锁的所有者调用pthread_mutex_unlock()。让我们来看一个例子,在下面的代码中创建了两个互斥锁:/* 创建并初始化互斥锁 */ pthread_mutex_t mutex1; pthread_mutex_t mutex2; pthread_mutex_init(&mutex1, NULL); pthread_mutex_init(&mutex2, NULL);接下来,两个线程…… 阅读更多

事务内存

Arnab Chakraborty
更新于 2019年10月11日 12:58:19

719 浏览量

事务内存起源于数据库理论,它提供了一种用于进程同步的替代策略。内存事务是原子的,是一系列内存读写操作。如果事务中的所有操作都已完成,则提交内存事务。否则,必须中止并回滚这些操作。可以通过添加到编程语言的功能来获得事务内存的易用性。考虑一个例子。假设我们有一个修改共享数据的函数update()。传统上,此函数将使用互斥锁(或信号量)编写,如下所示:void update (){ acquire(); /* 修改共享数据 */ …… 阅读更多

Solaris中的进程同步

Arnab Chakraborty
更新于 2019年10月11日 12:56:30

2K+ 浏览量

Solaris实现各种锁来支持多任务处理、多线程和多处理。它使用自适应互斥锁、条件变量、信号量、读写锁、旋转门来控制对临界区的访问。自适应互斥锁用于保护仅由短代码段访问的每个关键数据项。在多处理器系统上,它作为标准信号量自旋锁启动。如果锁由在另一个CPU上运行的线程持有,则线程自旋。如果锁由当前处于运行状态的线程持有,则线程阻塞,进入睡眠状态,直到被信号唤醒…… 阅读更多

Windows中的进程同步

Arnab Chakraborty
更新于 2019年10月11日 12:53:41

2K+ 浏览量

Windows操作系统是一个多线程内核,它为实时应用程序和多处理器提供支持。在单处理器系统上,Windows提供中断掩码来保护对全局资源的访问。它使用自旋锁来保护对全局资源的访问。内核仅使用自旋锁来保护短代码段,如Solaris。内核确保在持有自旋锁时,线程永远不会被抢占。Windows根据几种不同的机制(包括互斥锁、信号量、事件和计时器)提供调度程序对象以进行线程同步。系统通过要求线程为了访问数据而获得互斥锁的所有权来保护共享数据…… 阅读更多

如何使用信号量实现监视器?

Arnab Chakraborty
更新于 2019年10月11日 12:51:49

2K+ 浏览量

要使用信号量实现监视器,对于每个监视器,都提供一个互斥信号量(初始化为1)。进程必须在进入监视器之前执行wait(mutex),并在离开监视器后执行signal(mutex)。由于信令进程必须等到恢复的进程离开或等待,因此引入了另一个初始化为0的信号量next。信令进程可以使用next来挂起自身。还提供了一个整型变量next_count来计算挂起在next上的进程数。因此,每个外部函数F都被替换为:wait(mutex); … F的主体 … … 阅读更多

Grand Central Dispatch (GCD)

Arnab Chakraborty
更新于 2019年10月11日 12:48:37

731 浏览量

Grand Central Dispatch (GCD)——苹果Mac OS X和iOS操作系统的一项技术——是C语言扩展、API和运行时库的组合,允许应用程序开发人员识别要并行运行的代码段。与OpenMP一样,GCD管理大部分线程细节。GCD识别C和C++语言的扩展,称为块。块只是一个自包含的工作单元。它由插入在一对花括号{}前面的脱字符号^指定。下面显示了一个简单的块示例…… 阅读更多

什么是OpenMP?

Arnab Chakraborty
更新于 2019年10月11日 12:45:48

7K+ 浏览量

OpenMP是一组编译器指令以及用于用C、C++或FORTRAN编写的程序的API,它为共享内存环境中的并行编程提供支持。OpenMP将并行区域标识为可以并行运行的代码块。应用程序开发人员在其代码的并行区域中插入编译器指令,这些指令指示OpenMP运行时库并行执行该区域。下面的C程序说明了并行区域上方包含printf()语句的编译器指令:#include #include int main(int argc, char *argv[]){ /* 顺序代码 */ #pragma omp ... 阅读更多

数据并行与任务并行

Arnab Chakraborty
更新于 2019年10月11日 12:42:35

18K+ 浏览量

数据并行数据并行意味着在每个多个计算核心上并发执行相同的任务。让我们来看一个例子,求和大小为N的数组的内容。对于单核系统,一个线程只需对元素[0]…[N-1]求和。然而,对于双核系统,在核心0上运行的线程A可以对元素[0]…[N/2-1]求和,而同时在核心1上运行的线程B可以对元素[N/2]…[N-1]求和。因此,两个线程将在单独的计算核心上并行运行。任务并行任务…… 阅读更多

处理执行中的并行类型

Arnab Chakraborty
更新于 2019年10月11日 12:37:49

15K+ 浏览量

数据并行性数据并行性是指在多个计算核心上同时执行同一任务。例如,对大小为 N 的数组求和。对于单核系统,一个线程会简单地对元素 [0] ... [N − 1] 求和。然而,对于双核系统,在核心 0 上运行的线程 A 可以对元素 [0] ... [N/2 − 1] 求和,而同时在核心 1 上运行的线程 B 可以对元素 [N/2] ... [N − 1] 求和。因此,这两个线程将在不同的计算核心上并行运行。任务并行性任务……阅读更多

广告