1. NSThread的介绍
NSThread是苹果爸爸针对Pthread而封装的Objective-C对象, 有啥好处?
说到NSThread的话, 我么那就不得不提到它的底层叫做Pthread, 这是一个由C语言写的多线程技术, 可以在Unix, Linux和Windows上使用。但由于是用C语言所写的, 所以需要自己管理线程生命周期, 开发难度比较大(不得不佩服一下搞C语言的大佬们), 这里我们简单了解一下就好了, 想深入了解的话, 可以自行去谷歌一下.
中间省略了需要Pthread管理线程生命周期代码.
更加的面向对象, 简单易懂, 而且还可以直接操作线程对象.
之前我们经常看到[NSThread currentThread]这句代码, 就是获取当前线程信息的.
2. oc中创建线程以及线程设置名称
dispatch_queue_t queue = dispatch_queue_create("lyg.cputest", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
int rc = pthread_setname_np("lyg.cputest");
NSLog(@"getname returned thread %@", [NSThread currentThread]);
if (rc != 0)
{
printf("pthread_setname_np failed.");
}
});
dispatch_queue_t queue1 = dispatch_queue_create("lyg.cputestttt", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue1, ^{
[[NSThread currentThread] setName:@"lyg.cputestttt"];
});
static void dumpThreads(void) {
char name[256];
mach_msg_type_number_t count;
thread_act_array_t list;
task_threads(mach_task_self(), &list, &count);
for (int i = 0; i < count; ++i) {
pthread_t pt = pthread_from_mach_thread_np(list[i]);
if (pt) {
name[0] = '\0';
int rc = pthread_getname_np(pt, name, sizeof name);
NSLog(@"mach thread %u: getname returned %d: %s", list[i], rc, name);
} else {
NSLog(@"mach thread %u: no pthread found", list[i]);
}
}
}
3. 那么我们如何获取线程信息?
问题很简单:task_threads返回Mach端口的数组,而不是pthread_t的数组。在您致电pthread_getname_np时,您正在将Mach端口视为pthread_t。但是Mach端口不是pthread_t。您需要将每个转换为使用pthread_from_mach_thread_np一个pthread_t:
CPU使用率其实就是运行的程序占用的CPU资源,表示机器在某个时间点的运行程序的情况。
使用率越高,说明机器在这个时间上运行了很多程序,反之较少。
使用率的高低与CPU强弱有直接关系。
现代分时多任务操作系统对 CPU 都是分时间片使用的:比如A进程占用10ms,然后B进程占用30ms,然后空闲60ms,再又是A进程占10ms,B进程占30ms,空闲60ms;如果在一段时间内都是如此,那么这段时间内的占用率为40%。
CPU对线程的响应并不是连续的,通常会在一段时间后自动中断线程。
未响应的线程增加,就会不断加大CPU的占用。
cpu使用率高的原因有很多,但是一般都是由于病毒木马或开机启动项过多所致。
高CPU使用率也可能表明应用程序的调整或设计不良。
优化应用程序可以降低CPU的使用率。
内存使用率指的是此进程所开销的内存。
占内存大的程序不一定会占用很多的CPU资源,而占CPU大的程序也不一定开销太大的内存。
某一程序的CPU占用率过高会影响其他程序的运行。
而某一程序占用内存过大,会影响机器的整体性能。
https://www.jianshu.com/p/bc940ac493aa
网友评论