C++多核高级编程 - 03 操作系统的角色和任务

来源:互联网 发布:淘宝怎么查消费总额 编辑:程序博客网 时间:2024/04/28 01:27

1,  操作系统的角色

操作系统的作用主要有2个:

-    软件接口: 为计算机的硬件资源定义提供一致且定义良好的接口。

-    资源管理:管理硬件资源以及其他正在执行的应用软件,作业和程序。


1-1   提供一致的接口

操作系统出现之前程序员必须要熟悉特定的指令集和每个设备的特性。显卡,磁盘驱动,打印机等都有完全不同的指令集,而且不同厂商的指令集也不一样。程序很难有通用性。操作系统的概念改变了这一切,它封装了设备的内部结构,是程序员可以通过简单的API和SPI来实现对硬件设备的控制。真正对于硬件的操作则由操作系统来完成。

1-2   管理硬件资源和其他应用软件

操作系统将控制程序的进程或线程,访问处理器,内存,IO端口,中断和存储器。在多数环境中,在任意时刻都会有多个程序正在被执行或等待被执行。由于处理器,内存等资源有限,操作系统必须决定哪个程序使用哪个处理器,使用时间和调度策略。操作系统为进程分配硬件资源,并且避免进程间的相互侵犯。

1-3   开发人员与操作系统的交互

操作系统为多线程或多处理的应用程序提供了不同层次的支持,层次越低开发人员需要掌握的技巧和知识就越复杂。

 sys_layerr


1-4   操作系统的核心服务

下表简单的介绍了操作系统的核心服务,虽然他与所有的应用程序开发有关,但对于多线程程序来讲则更为明显。


操作系统核心服务描述进程管理管理进程的行为和资源,包括进程执行,资源分配与保护,同步内存管理管理进程的内存分配文件系统管理在存储设备上组织收集数据,并提供访问的接口I/O管理管理来自硬件设备的输入/输出请求进程间通信管理管理进程间的通信


2,  分解以及操作系统的任务

任务的分解对于软件的开发意义重大。

-    软件的基本活动是将问题和解决方案按某种方式分解,并在软件中加以体现。

-    并行编程,多线程,多处理都要求将软件分解为可以由操作系统调度,从而可被并发处理的执行单元。


一个多线程程序任务分解的例子:

此图主要描述了如何从一个问题映射成一多线程的程序

task_dis


3,  隐藏操作系统的任务

隐藏操作系统任务的真正目标是在软件设计不需要陷入到进程和线程实现细节的前提下,理解在执行多线程和多处理程序中操作系统的作用。CMP发展的终极方向是多个内核位于一芯片上,终极目标是芯片上有成百上千个内核大规模的并行,了解操作系统的任务很重要,但是没人希望在设计软件的过程中接触这部分细节。


例子:利用C++封装POSIX API 的一种设计想法

uml_pic


编译命令:  c++ -o test.o main.cpp thread_object.cpp user_thread.cpp -lrt -lpthread


main.cpp

#include "thread_object.h"int main(){    user_thread worker[2];    worker[0].name("W1");    worker[1].name("W2");    worker[0].m_sleep_timer = 1;    worker[1].m_sleep_timer = 3;    worker[0].run();    worker[1].run();    worker[0].join();    worker[1].join();    return 0;}

thread_object.h

#include <pthread.h>#include <iostream>#include <string>#ifndef __THREAD_OBJECT_H__#define __THREAD_OBJECT_H__using namespace std;class thread_object{public:    thread_object();    ~thread_object();    void run(void);    void join(void);    void name(string str);        string name(void);    friend void* thread(void *param);protected:    virtual void do_something(void) = 0;private:    pthread_t m_tid;    string    m_name;  };class user_thread: public thread_object{public:    user_thread();    ~user_thread();    int m_sleep_timer;protected:    virtual void do_something(void);};#endif

thread_object.cpp

#include "thread_object.h"#include <unistd.h>user_thread::user_thread(){    cout << "Create a user thread object"<< endl;}user_thread::~user_thread(){    cout << "Delete a user thread object" <<endl;}void user_thread::do_something(void){    for (;;)    {        cout << "Thread:" << name() << " is working" << endl;        sleep(m_sleep_timer);    }}

user_thread.cpp

#include "thread_object.h"thread_object::thread_object(){};thread_object::~thread_object(){    pthread_join(m_tid, NULL);}void thread_object::run(void){    pthread_create(&m_tid, NULL, thread, this);}void thread_object::join(void){    cout << "Join Thread: " << m_tid << endl;    pthread_join(m_tid, NULL);}void thread_object::name(string str){    m_name = str;}string thread_object::name(){    return m_name;}void* thread(void* param){    thread_object* oThread;    oThread = static_cast<thread_object *>(param);    oThread->do_something();    return NULL;}