随笔分类 -  进程.线程.事件.通信.内核对象.线程绑核

摘要:为什么(3 个原因)以及如何使用硬(相对于软)CPU 亲和性(affinity) Eli Dow (emdow@us.ibm.com), 软件工程师, IBM Linux Test and Integration Center 简介: 了解 Linux® 2.6 调度器如何处理 CPU 亲和性(affinity)可以帮助您更好地设计用户空间的应用程序。软亲和性(affinity) 意味着进... 阅读全文
posted @ 2012-02-16 21:46 dzqabc 阅读(609) 评论(0) 推荐(0) 编辑
摘要:1. 在Linux下,如何确认是多核或多CPU: #cat /proc/cpuinfo 如果有多个类似以下的项目,则为多核或多CPU: processor : 0 ...... processor : 1 2. Linux下,如何看每个CPU的使用率: #top -d 1 之后按下1. 则显示多个CPU Cpu0 : 1.0%us, 3.0%sy, 0.0%ni, 9... 阅读全文
posted @ 2012-02-16 21:38 dzqabc 阅读(9876) 评论(0) 推荐(0) 编辑
摘要:CPU亲合力就是指在Linux系统中能够将一个或多个进程绑定到一个或多个处理器上运行.一个进程的CPU亲合力掩码决定了该进程将在哪个或哪几个CPU上运行.在一个多处理器系统中,设置CPU亲合力的掩码可能会获得更好的性能.一个CPU的亲合力掩码用一个cpu_set_t结构体来表示一个CPU集合,下面的几个宏分别对这个掩码集进行操作: ·CPU_ZERO() 清空一个集合 ·CPU_SET()与CPU_CLR()分别对将一个给定的CPU号加到一个集合或者从一个集合中去掉. ·CPU_ISSET()检查一个CPU号是否在这个集合中.下面两个函数就是用来设置获取线程CPU 阅读全文
posted @ 2012-02-15 21:39 dzqabc 阅读(11827) 评论(2) 推荐(1) 编辑
摘要:假设业务模型中耗费cpu的分四种类型,(1)网卡中断(2)1个处理网络收发包进程(3)耗费cpu的n个worker进程(4)其他不太耗费cpu的进程基于1中的 负载均衡是针对进程数,那么(1)(2)大部分时间会出现在cpu0上,(3)的n个进程会随着调度,平均到其他多个cpu上,(4)里的进程也是随着调度分配到各个cpu上;当发生网卡中断的时候,cpu被打断了,处理网卡中断,那么分配到cpu0上的worker进程肯定是运行不了的其他cpu上不是太耗费cpu的进程获得cpu时,就算它的时间片很短,它也是要执行的,那么这个时候,你的worker进程还是被影响到了;按照调度逻辑,一种非常恶劣的情况是 阅读全文
posted @ 2012-02-15 21:17 dzqabc 阅读(12049) 评论(2) 推荐(1) 编辑
摘要:linux下进程 (一) 理解Linux下进程的结构 Linux下一个进程在内存里有三部份的数据,就是“数据段”,“堆栈段”和“代码段”,其实学过汇编语言的人一定知道,一般的CPU象I386,都有上述三种段寄存器,以方便操作系统的运行。“代码段”,顾名思义,就是存放了程序代码的数据,假如机器中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码段。 堆栈段存放的就... 阅读全文
posted @ 2011-12-15 21:46 dzqabc 阅读(8287) 评论(0) 推荐(0) 编辑
摘要:要达到DOS程序运行时不显示窗口的效果,有两种可能:一是创建该DOS进程时,指定不创建窗口;二是隐藏该DOS进程有窗口。根据MSDN,CreateProcess() API的原型如下: BOOL CreateProcess( LPCTSTR lpApplicationName, LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID l 阅读全文
posted @ 2010-08-22 16:37 dzqabc 阅读(1800) 评论(0) 推荐(0) 编辑
摘要:子线程中定义消息,进行消息循环 窗口多线程中倘若要使子线程能够接收并处理各种消息,则应该在子线程中增加消息循环,不断接收和处理消息,当然这样子的子线程就会像主线程一样运行,只不过处理的消息一般为自定义消息了,而本应在子线程中做的各种处理则变成了消息循环中对不同消息的处理.同时应注意添加了消息循环的子线程同窗口主线程相似,在出现对某个消息进行大量处理时将导致对后续消息处理的暂停. 消息循环: peekmessage(&msg,null,0,0,pm_remove); while(getmessage(&msg,null,0,0)) { switch(msg.message) { 阅读全文
posted @ 2010-07-04 02:48 dzqabc 阅读(1931) 评论(0) 推荐(0) 编辑
摘要:在开发软件过程里,也经常碰到进程间共享数据的需求。比如A进程创建计算数据,B进程进行显示数据的图形。这样的开发方式可以把一个大程序分开成独立的小程序,提高软件的成功率,也可以更加适合团队一起开发,加快软件的开发速度。下面就来使用文件映射的方式进行共享数据。先要使用函数 CreateFileMapping来创建一个想共享的文件数据句柄,然后使用MapViewOfFile来获取共享的内存地址,然后使用 OpenFileMapping函数在另一个进程里打开共享文件的名称,这样就可以实现不同的进程共享数据。 函数 CreateFileMapping、MapViewOfFile声明如下: WINBAS. 阅读全文
posted @ 2010-04-20 11:25 dzqabc 阅读(3824) 评论(0) 推荐(0) 编辑
摘要:互斥量(Mutex)CreateMutex:创建一个互斥量 HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, // pointer to security attributes BOOL bInitialOwner, // flag for initial ownership LPCTSTR lpName // pointer to mutex-object name ); Parameters lpMutexAttributes [in, optional] A pointer to a SECURITY_ATTRIBU 阅读全文
posted @ 2010-03-23 21:43 dzqabc 阅读(2352) 评论(0) 推荐(0) 编辑
摘要://========================================================================//TITLE:// 在非主线程中创建窗口//AUTHOR:// norains//DATE:// Saturday 29-December-2007//Environment:// VS2005 + SDK-WINCE5.0-MIPSII //======================================================================== 很多朋友都会有过这样的经历,为什么在主线程中创建窗口且窗口工 阅读全文
posted @ 2010-03-23 17:09 dzqabc 阅读(262) 评论(0) 推荐(0) 编辑
摘要:下面的代码我调试了将近一个星期,你能够看出什么地方出了问题吗?线程函数: DWORD WINAPI ThreadProc() { while(!bTerminate) { // 从一个链表中读取信息并且插入到CListCtrl中 // CListCtrl的句柄是通过线程参数传递进来的 for(;;) { ReadInfoFromList(); InsertToCListCtrl(); } } }主线程中使用CreateThread 启动线程。当想终止子线程时,在主线程中: bTerminate = TRUE; WaitForSingleObject(threadHandle, INFINITE 阅读全文
posted @ 2010-03-23 16:20 dzqabc 阅读(318) 评论(0) 推荐(0) 编辑
摘要:使用多线程技术可以显著地提高程序性能,本文就讲讲在程序中如何使用工作线程,以及工作线程与主线程通讯的问题。一 创建线程 使用MFC提供的全局函数AfxBeginThread()即可创建一个工作线程。线程函数的标准形式为 UINT MyFunProc(LPVOID );此函数既可以是全局函数,也可以是类的静态成员函数。之所以必须是静态成员函数,是由于类的非静态成员函数,编译器在编译时会自动加上一个this指针参数,如果将函数设置为静态的成员函数,则可以消除this指针参数。如果想在线程函数中任意调用类的成员变量(此处指的是数据成员,而不是控件关联的成员变量),则可以将类的指针作为参数传递给线程函 阅读全文
posted @ 2010-03-23 00:01 dzqabc 阅读(1672) 评论(0) 推荐(0) 编辑
摘要:利用关键代码段实现多线程同步关键代码段又叫临界区,是指一个小代码段,在代码能够执行前,它必须对具有对资源的独中权。如一次只能一个人打电话的公用电话厅,开始时要建个电话厅(初始化临界区:InitializeCriticalSection),一个人打电话(EnterCiticalSection),打完电话离开,便于别人打(LeaveCriticalSection),电话厅不用时,拆掉,释放资源(DeleteCriticalSection);如下程序实现多线程同步:#include <windows.h>#include <iostream>using namespace s 阅读全文
posted @ 2009-08-28 18:42 dzqabc 阅读(352) 评论(0) 推荐(0) 编辑
摘要:CreateProcess 说明: WIN32API函数CreateProcess用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件。 函数原型: BOOL CreateProcess ( LPCTSTR lpApplicationName, LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes。 LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironmen 阅读全文
posted @ 2009-05-11 14:17 dzqabc 阅读(1356) 评论(0) 推荐(0) 编辑
摘要:三个SDK函数:WinExec,ShellExecute,CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂。WinExec两个参数,前一个指定路径,后一个指定显示方式。ShellExecute可以指定工作目录,并且还可以寻找文件的关联直接打开不用加载与文件关联的应用程序,ShellExecute还可以打开网页,启动相应的邮件关联发送邮件等等。CreateProcess一共有十个参数,不过大部分都可以用NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等。如果我们要 阅读全文
posted @ 2009-05-11 13:46 dzqabc 阅读(734) 评论(0) 推荐(0) 编辑
摘要:线程的基础知识1.进程与线程有那些区别和联系? 每个进程至少需要一个线程。 进程由两部分构成:进程内核对象,地址空间。线程也由两部分组成:线程内核对象,操作系统用它来对线程实施管理。线程堆栈,用于维护线程在执行代码时需要的所有函数参数和局部变量。 进程是不活泼的。进程从来不执行任何东西,它只是线程的容器。线程总是在某个进程环境中创建的,而且它的整个寿命期都在该进程中。 如果在单进程环境中,有多个线程正在运行,那么这些线程将共享单个地址空间。这些线程能够执行相同的代码,对相同的数据进行操作。这些线程还能共享内核对象句柄,因为句柄表依赖于每个进程而不是每个线程存在。进程使用的系统资源比线程多得多。 阅读全文
posted @ 2009-04-09 12:56 dzqabc 阅读(317) 评论(0) 推荐(0) 编辑
摘要:内核对象可用于不同进程间线程的同步。1.Wait系列函数WaitForSingleObject 挂起当前线程,直到该函数返回。(被等待的对象处于Signal状态或等待超时) 若有多个线程调用该函数等待同一个内核对象,那么当这个内核对象处于Signal状态时只有一个线程会被唤醒。 若线程中有创建Windows的代码,需要用MsgWaitForMultipleObjects代替WaitForSingleObject,否则会产生死锁。WaitForMultipleObjects若需要同时等待多个内核对象,则可以调用该函数2.事件内核对象自动事件当事件处于Signal状态时,只有一个等待该事件的线程会 阅读全文
posted @ 2009-04-09 11:29 dzqabc 阅读(329) 评论(0) 推荐(0) 编辑
摘要:内核对象主要要用来供系统和应用程序管理系统资源,像进程、线程、文件等。存取符号对象、事件对象、文件对象、作业对象、互斥对象、管道对象、等待计时器对象等都是内核对象。我们在编程时经常要创建、打开和操作它们。内核对象通过调用函数来创建,如要创建文件映射对象,就调用CreateFileMapping函数。每个内核对象都会分配一个内存块,只能由其内核访问。该内存块是一种数据结构,用于管理对象的各种信息。 我们的应用程序不能直接访问内核对象的数据结构。需要通过Windows提供的函数来访问。 内核对象由内核拥有,并不是进程所拥有。每个内核对象都有一个计数器来存储有多少个进程在使用它的信息。 内核对象有安 阅读全文
posted @ 2009-04-08 12:34 dzqabc 阅读(286) 评论(0) 推荐(0) 编辑
摘要:9.6.2 互斥对象与关键代码段的比较就等待线程的调度而言,互斥对象与关键代码段之间有着相同的特性。但是它们在其他属性方面却各不相同。表9 - 1对它们进行了各方面的比较。表9-1 互斥对象与关键代码段的比较特性互斥对象关键代码段运行速度慢快是否能够跨进程边界来使用是否声明HANDLE hmtx;CRITICAL_SECTION cs;初始化h m t x = C r e a t e M u t e x (N U L L,FA L S E,N U L L);I n i t i a l i z e C r i t i c a l S e c t i o n ( & e s );清除C l 阅读全文
posted @ 2009-04-08 11:36 dzqabc 阅读(554) 评论(0) 推荐(0) 编辑
摘要:ResetEvent ResetEvent 这个函数把指定的事件对象设置为无信号状态。 BOOL ResetEvent( HANDLE hEvent ); 参数说明: hEvent [in] 指向事件对象的句柄.由 CreateEvent or OpenEvent 函数返回。 这个句柄需要拥有EVENT_MODIFY_STATE 访问权限. 函数成功,返回非0值,否则返回0值,可以调用GetLastError得到错误的详细信息。 Remarks 一个事件对象一直都保持在无信号状态,直到显式调用 SetEvent or PulseEvent 函数把它设置到有信号状态。 这些无信号的事件对象会阻塞 阅读全文
posted @ 2009-04-07 16:55 dzqabc 阅读(590) 评论(0) 推荐(0) 编辑